﻿using System;
using System.Xml.Serialization;

namespace SmartPlant.Updater
{
    /// <summary>
    /// 这个类的对象为您提供了有关更新的所有细节，这些细节对您自己处理更新逻辑很有用。
    /// </summary>
    [XmlRoot("item")]
    public class UpdateInfoEventArgs : EventArgs
    {
        private string _changelogURL;
        private string _downloadURL;

        /// <inheritdoc />
        public UpdateInfoEventArgs()
        {
            Mandatory = new Mandatory();
        }

        /// <summary>
        /// 如果有新的更新可用，则返回true，否则返回false。
        /// </summary>
        public bool IsUpdateAvailable { get; set; }

        /// <summary>
        /// 如果在检查更新时出现错误，则此属性不会为null。
        /// </summary>
        [XmlIgnore]
        public Exception Error { get; set; }

        /// <summary>
        /// 下载更新文件的URL。
        /// </summary>
        [XmlElement("url")]
        public string DownloadURL
        {
            get => GetURL(AutoUpdater.BaseUri, _downloadURL);
            set => _downloadURL = value;
        }

        /// <summary>
        /// 指定新更新中的更改的网页的URL。
        /// </summary>
        [XmlElement("changelog")]
        public string ChangelogURL
        {
            get => GetURL(AutoUpdater.BaseUri, _changelogURL);
            set => _changelogURL = value;
        }

        /// <summary>
        /// 返回可供下载的应用程序的最新版本。
        /// </summary>
        [XmlElement("version")]
        public string CurrentVersion { get; set; }

        /// <summary>
        /// 返回当前安装在用户电脑上的应用程序的版本。
        /// </summary>
        public Version InstalledVersion { get; set; }

        /// <summary>
        /// 显示更新是必需的还是可选的。
        /// </summary>
        [XmlElement("mandatory")]
        public Mandatory Mandatory { get; set; }

        /// <summary>
        /// 安装程序使用的命令行参数。
        /// </summary>
        [XmlElement("args")]
        public string InstallerArgs { get; set; }

        /// <summary>
        /// 更新文件的校验和。
        /// </summary>
        [XmlElement("checksum")]
        public CheckSum CheckSum { get; set; }

        internal static string GetURL(Uri baseUri, string url)
        {
            if (!string.IsNullOrEmpty(url) && Uri.IsWellFormedUriString(url, UriKind.Relative))
            {
                Uri uri = new Uri(baseUri, url);

                if (uri.IsAbsoluteUri)
                {
                    url = uri.AbsoluteUri;
                }
            }

            return url;
        }
    }

    /// <summary>
    /// 用于获取与强制字段相关的XML值的强制类。
    /// </summary>
    public class Mandatory
    {
        /// <summary>
        /// 必填字段的值。
        /// </summary>
        [XmlText]
        public bool Value { get; set; }

        /// <summary>
        /// 如果设置了此项并且“Value”属性设置为true，则只有当当前安装的版本小于此属性的值时，它才会触发强制更新。
        /// </summary>
        [XmlAttribute("minVersion")]
        public string MinimumVersion { get; set; }

        /// <summary>
        /// 应用于此更新的模式。
        /// </summary>
        [XmlAttribute("mode")]
        public Mode UpdateMode { get; set; }
    }

    /// <summary>
    ///     Checksum class to fetch the XML values for checksum.
    /// </summary>
    public class CheckSum
    {
        /// <summary>
        ///     Hash of the file.
        /// </summary>
        [XmlText]
        public string Value { get; set; }

        /// <summary>
        ///     Hash algorithm that generated the hash.
        /// </summary>
        [XmlAttribute("algorithm")]
        public string HashingAlgorithm { get; set; }
    }
}